需要注意的是：创建的工程文件需要放到跟 zephyr 同等级路径的目录文件夹下，或者放到 zephyr 的下级文件夹下。
zephyr
 ├──  arch 				包含和硬件体系结构相关的代码，每种平台占一个相应的目录
 ├──  boards 			板级代码及相关的配置文件，如 nRF9160_pca10090 等
 ├──  cmake 			构建 Zephyr 需要额外的构建脚本
 ├──  doc 				系统文档目录
 ├──  drivers 			设备驱动，每个不同的驱动占用一个子目录
 ├──  dts 				devicetrree 源文件，用于描述特定板子的设备细节，如外设寄存器数量及寄存器地址
 ├──  ext 				其他功能的支持
 ├──  include 			包括所有公共 api 的文件，除了在 lib 下定义的部分
 ├──  kernel 			与架构无关的内核代码
 ├──  lib 				库代码，包括最小的标准 C 库
 ├──  misc 				不属于任何其他顶级目录的杂项代码
 ├──  modules 			提供特定芯片系列的一些外设配置选项
 ├──  samples 			演示使用 Zephyr 特性的示例应用程序
 ├──  scripts 			用于构建和测试 Zephyr 应用程序的各种程序和其他文件。
 ├──  soc 				SoC 相关代码和配置文件，如 nRF9160 soc
 ├──  subsys 			zephyr 子系统，包括 USB，网络，文件系统及蓝牙等
 ├──  tests 	        测试 Zephyr 特性的代码
 ├──  CMakeLists.txt 	CMake 构建系统的顶层文件，包含构建 Zephyr 所需的大量逻辑
 ├──  Kconfig 			顶层 Kconfig 文件，它引用 Kconfig.zephyr 文件。也可以在顶级目录中找到
 ├──  west.yml 			West 清单，列出由 West 命令行工具管理的外部存储库

NCS 或者 Zephyr 里面主要包含两种配置项：Kconfig 和 DeviceTree，Kconfig 主要负责软件的配置，DeviceTree 主要负责板子硬件的配置。两者最终都会生成一个 .h 文件，其中Kconfig 生成的头文件为：autoconf.h，而 DeviceTree 生成的头文件为 devicetree_unfixed.h，他们都在如下目录

<build_dir> / zephyr / include / generated


编译选项细节：
zephyr_library_sources_ifdef 是 Zephyr RTOS 的预处理指令之一，用于在编译时根据特定条件包含 或 排除一组C源文件。

如果指定的条件为真，则 zephyr_library_sources_ifdef 会包含一组指定的源文件，否则则不包含。该指令通常在 CMakeLists.txt 文件中使用，例如：

zephyr_library_sources_ifdef(CONFIG_MYFEATURE myfeature.c)
在上述示例中，当 Zephyr 配置选项 CONFIG_MYFEATURE 被开启时，该文件夹下的 myfeature.c 文件会被编译和链接到 Zephyr RTOS 内核中。否则，该文件将被忽略。

使用 zephyr_library_sources_ifdef 可以使编译过程更加灵活，同时避免在编译过程中因不必要的源码文件而浪费时间和空间。

移植zephyr到N32上的。
具体的语法，可以参考：https://docs.zephyrproject.org/latest/guides/dts/index.html
boards\arm\n32g45xvl_stb\n32g45xvl_stb.yaml文件开发板描述。描述开发板的一些特性：mcu 及架构，支持的外设等。
boards\arm\n32g45xvl_stb\n32g45xvl_stb_defconfig文件是 KConfig 的选项文件，这个文件是代替手动选择 KConfig 选项


.yaml文件作用和含义， 以sample.yaml为例子

/*
在该文件中，测试用例的名称为 “PWM LED sample”，描述了 PWM LED 驱动程序的演示。这个示例测试用例涉及一个 LED PWM 驱动程序，在特定的条件下模拟亮度控制和闪烁功能。测试用例文件中使用了多个属性来进一步描述和控制测试过程，例如使用 dt_compat_enabled 作为过滤条件、设置平台限制，以及限制测试的超时时间等。在harness_config 中，配置了多行正则表达式，用来匹配控制台输出结果，在最终的测试结果中作为评估的标准。
*/

sample:
  description: Demonstration of the PWM LED driver   //描述
  name: PWM LED sample								//名字
tests:
  sample.drivers.led.led_pwm:						//.led 标识了事实上为驱动程序定义了一个软件绑定名称，
											//以帮助代码正确地通过特定的设备节点在设备树上查找并控制特定的 LED 设备。
    filter: dt_compat_enabled("pwm-leds") //表示只有在"pwm-leds"被兼容时才，该节点才会被包含在最终的设备树中。
    tags: LED
    depends_on: pwm			//表示这个驱动依赖于PWM，以确保在该节点使用之前先对 pwm 节点进行配置和初始化。
    platform_exclude: reel_board
	
	/*
	这行代码是测试用例文件中的一个属性，用于指定在哪些平台上不运行测试用例，其中“reel_board”是一个在 Device Tree 中定义的平台名称
	platform_exclude 用于将测试限制为特定的平台或排除特定的平台，在不同的测试环境中可以帮助您更精确地控制测试的运行结果。如果测试需要在特定的平台上运行，您可以使用 platform_include 参数来指定。如果您不使用 platform_exclude 或 platform_include 参数，则测试将在所有平台上运行。*/
	
    timeout: 20
    harness: console 
    harness_config:
      type: multi_line	//表示测试结果包含多行文本输出
      ordered: true		//表示测试输出结果必须按照指定的顺序出现；
      regex:		//参数指定了一些正则表达式，用于从测试输出中提取有用的信息。具体来说，这些正则表达式用于提取关于测试 LED 灯的测试结果的信息。
        - "Testing LED \\d+"
        - "Turned on"
        - "Turned off"
        - "Increasing brightness gradually"
        - "Blinking on: 0.1 sec, off: 0.1 sec"
        - "(Blinking on: 1 sec, off: 1 sec|Cycle period not supported)"
        - "Turned off, loop end"

//以上为测试信息提前，观察程序的pwm_led的循环中，其实这些都是程序运行步骤是的流程中所打印的log

//platform_exclude: reel_board  指定那些平台上不运行。


/*
在这个例子中，.led 和 led_pwm 是两个不同的概念。.led 将会在 Zephyr OS 的 menuconfig 界面上列出可用的 LED 设备，而 led_pwm 是 PWM 驱动程序的名称，用于与 LED 设备相关联。

在 Zephyr OS 中，支持使用不同的驱动程序来控制 LED 灯。例如，除了 PWM 驱动程序外，还可以使用 GPIO 控制器、PWM 控制器、I2C 控制器等其他驱动程序来控制 LED 灯。因此，当使用某个驱动程序时，需要将其指定为与 LED 设备相关联的驱动程序。

.led 后缀是 Zephyr OS 的一种命名约定，用于标识可用于控制 LED 的设备。在使用 led_pwm 驱动程序时，在设备树中参考的设备节点中需要指定 label 属性为与 LED 相关的设备名称并以 .led 结尾，这样在 menuconfig 界面上，用户可以选择使用 led_pwm 驱动程序来控制特定的 LED 设备。

因此，按照这种命名约定，.led 标识了事实上为驱动程序定义了一个软件绑定名称，以帮助代码正确地通过特定的设备节点在设备树上查找并控制特定的 LED 设备。*/



.overlay文件
示例如LED_PWM
/*
 * Copyright (c) 2023 STMicroelectronics
 * SPDX-License-Identifier: Apache-2.0
 */
/ {
	/* do not define the leds on the pa5 and pb14 but pwmleds */
	leds {
		status = "disabled";
	};
};

&pwmleds {
	/* NOTE: enable here because it is disabled by default */
	status = "okay";
};

&timers2 {
	pwm2: pwm {
		/* Change the pin used for PWM2 channel 1 */
		/delete-property/ pinctrl-0;  ///delete-property/ 表示删除某个节点下的一个属性。
		pinctrl-0 = <&tim2_ch1_pa5>;	//重新指定某个节点下的一个属性。
	};
};


prj.conf
示例是LED_PWM

CONFIG_LOG=y

CONFIG_PWM=y

CONFIG_LED=y

CONFIG_LOG_MODE_IMMEDIATE=y


Zephyr 中的配置系统包括两个部分：Kconfig 和 prj.conf。Kconfig 使用 .kconfig 文件定义各种配置选项，这些选项可以在整个系统中使用。prj.conf 则是应用程序的配置文件，用于在应用程序级别覆盖 system-wide 的配置。prj.conf 文件位于应用程序目录的根目录下，名称必须为 prj.conf。

因此，应用程序的全局选项应该在 Kconfig 文件中定义，例如：
config MY_OPTION_A
    bool "My Option A"
    help
        This is a help string for My Option A

然后，在应用程序目录中的 prj.conf 文件中，您可以设置这个选项的值：

CONFIG_MY_OPTION_A=y
需要注意的是，如果在 prj.conf 文件中设置了一个选项并且尚未在 Kconfig 中定义，Zephyr 将发出警告并忽略该设置。

更多关于 Zephyr 配置系统的信息，可以参考 Zephyr 官方文档：Zephyr Configuration System
		
安装额外的 Python 依赖项，它们在 scripts/requirements.txt 中进行了声明：  //也就是可以根据自己的项目需求去设置。
> pip3 install -r zephyr\scripts\requirements.txt


Cmake 问题，使用choco虽然安装好了Cmake包，但是路径不知，环境变量还是没有帮我加上去，所以只能去官方的网址去自行下载软件安装和添加环境变量
	
west build -p auto -b nrf52dk_nrf52832 samples\basic\blinky		编译
		Cmake 编译时如果你也和我一样用choco安装的的，但是在cmd窗口无法运行cmake命令，这说明系统环境你没设置。我是真没找到cmake的exe或者说bin路径，所以我只能去下载官网去安装cmake环境。所以这里是外部安装cmake.那么这个环境设置之后是可以在终端找到的，如果要编译zephyr,你还需要把之前choco安装的卸载掉，不然会起冲突。另外环境变量中我结合了arm gun的和zephyr SDK的两种编译链，但后面是直接使用zephyr SDK的编译。
		ZEPHYR_SDK_INSTALL_DIR  E:\zephyr-sdk-0.16.1_windows-x86_64
		ZEPHYR_TOOLCHAIN_VARIANT zephyr
		
		具体参考官网。
		
		
如果用arm的交叉编译链要使用win32的，虽然停产了。
gcc-arm-none-eabi-10.3-2021.10-win32.zip
测试过是可以的。


移植Zyphyr系统到F429运行。

west flash -d igt6 -r jlink  下载命令。 jlink必须全局变量，不然找不到。 west :命令头；flash：下载的flash -d表示自定义输出文件目录如果目录不存在会自动生成文件夹名字为igt6; -r jlink 
west build -p always -b stm32f429ig -d igt6  .\samples\basic\blinky\
west flash -d igt6 -r jlink  这个是指定在编译的工程目录下下载程序固件


west build -p always -b stm32f429ig .\samples\basic\blinky\
west flash -d build -r jlink
/*
在 west build 命令中，.\samples\basic\blinky\ 表示参与编译的项目文件夹路径，即你要编译哪个项目。在这个命令中，.\ 表示当前文件夹, samples\basic\blinky\ 则是相对于当前文件夹的路径，表示编译Zephyr源代码中 samples 目录下的 basic/blinky 示例应用程序。

简单解释一下这个路径的意思：

前面的 . 表示当前路径，即当前终端所在目录。
samples 表示 Zephyr 源代码中包含示例和应用程序的目录。
basic/blinky 是 samples 下的一个示例应用程序文件夹。
在执行 west build 命令时，你需要将当前路径切换到 Zephyr 源代码树的根目录，然后通过相对路径或绝对路径指定要编译的项目。

在本例中，执行这个命令将会编译 Zephyr 内核源代码和 blinky 示例程序，并生成一个二进制文件可以在芯片上运行。

如果你已经在 blinky 目录下，并且你的当前工作目录是 blinky 目录，那么你不需要在 west build 命令中包含 .\samples\basic\blinky\，你只需要执行以下命令：

west build -p always -b stm32f429ig
这个命令中 -p 参数用来促使项目重新编译，即使已经编译过一次了。-b 参数用来指定你要使用的开发板。

因为你已经在 blinky 目录中，所以默认 west build 命令会查找当前目录下的 CMakeLists.txt 文件，并使用这个文件编译 blinky 示例程序的源代码并生成相应的二进制文件。

*/




在其他路径中搭建工程
基本文件架构：

工程文件
├── CMakeLists.txt
├── prj.conf
├── <boards>.overlay
└── src
         └── main.c
		 
		 
prj.conf 文件是负责软件配置，是通过一系列的宏定义来控制某些库或者驱动的设置；
.overlay 文件是负责硬件配置，定义你使用到的硬件及其引脚，如 UART，I2C 等
